import { useState } from 'react';
import { objectToQuery } from 'beta/utils/helpers';
import getConfig from 'next/config';
import {
  AddItemsToCartInput,
  useAddItemsToCartMutation,
  useCreateOrderMutation,
  useCustomerNationalIdQuery,
  WhenToApply,
} from 'typings/graphql';

import { CardItem } from '../components/SellingCardItem';

export const useCompleteOrderForContract = (
  whenToApply: WhenToApply,
  contractId: string,
  customerId: string,
  cardItems?: CardItem[],
) => {
  const { data: payerIdData } = useCustomerNationalIdQuery({
    variables: { input: { id: customerId } },
  });

  const { publicRuntimeConfig } = getConfig();
  const redirectURL = publicRuntimeConfig.NOVA_WEB_URL ?? '';

  const payerNationalId = payerIdData?.customer?.nationalId ?? '';

  const createCartItems = (payerNationalId: string, cartItems: CardItem[]): AddItemsToCartInput => {
    return {
      customer: { ssn: payerNationalId },
      items: cartItems.map((item) => {
        return {
          quantity: 1,
          variantId: item.id,
          customAttributes: {
            whenToApply,
            originContractId: contractId,
            type: 'Upsell',
          },
        };
      }),
    };
  };
  const [addItemsToCart, { loading: addCartItemsLoading, error: addToCartError }] =
    useAddItemsToCartMutation({
      onCompleted: (data) => {
        if (data.addItemsToCart.cart?.id) {
          const requiresPaymentInfo =
            data.addItemsToCart.cart.paymentRequirements.requiresRecurringPaymentInfo ||
            data.addItemsToCart.cart.paymentRequirements.requiresPaymentInfo;
          if (requiresPaymentInfo) {
            const redirectQueryParam = objectToQuery({
              cartId: data.addItemsToCart.cart.id,
              customerId: customerId,
              nationalId: payerNationalId,
            });
            window.location.href = `${redirectURL}/barinn/fiber-greidsla?${redirectQueryParam}`;
          } else {
            createOrder({
              variables: {
                input: {
                  cartId: data.addItemsToCart.cart?.id,
                },
              },
            });
          }
        }
      },
    });

  const [createOrder, { loading: creatOrderLoading, error: orderError }] = useCreateOrderMutation({
    onCompleted: (data) => {
      if (data.createOrder.order?.id) {
        setOrderComplete(true);
      }
    },
  });

  const [orderComplete, setOrderComplete] = useState(false);

  const addToCartAndCreateOrder = async () => {
    if (cardItems && cardItems.length > 0) {
      await addItemsToCart({
        variables: {
          input: createCartItems(payerNationalId, cardItems),
        },
      });
    }
  };

  const onSubmit = () => {
    addToCartAndCreateOrder();
  };

  return {
    onSubmit,
    orderComplete,
    creatOrderLoading,
    addCartItemsLoading,
    orderError,
    addToCartError,
  };
};

export default useCompleteOrderForContract;
